using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Decisions.HL7.Message;
using DecisionsFramework;

namespace Decisions.HL7.Message
{
    public class ProcessingPriorityAttribute:RuleAttribute
    {
        private Dictionary<HL7Version, string[]> validVersionCodes = new Dictionary<HL7Version, string[]>();
        private Dictionary<HL7Version, string[]> validVersionDescriptions = new Dictionary<HL7Version, string[]>();
        private Dictionary<HL7Version, HL7TableType> tableVersionTypes = new Dictionary<HL7Version, HL7TableType>();

        public ProcessingPriorityAttribute()
        {
            // init the values for table version types
						tableVersionTypes[HL7Version.v23] = HL7TableType.HL7;
						tableVersionTypes[HL7Version.v231] = HL7TableType.HL7;
						tableVersionTypes[HL7Version.v24] = HL7TableType.HL7;
						tableVersionTypes[HL7Version.v25] = HL7TableType.HL7;
						tableVersionTypes[HL7Version.v251] = HL7TableType.HL7;
						tableVersionTypes[HL7Version.v26] = HL7TableType.HL7;
						tableVersionTypes[HL7Version.v27] = HL7TableType.HL7;
			
            
			// init the values for version codes
						validVersionCodes[HL7Version.v23] = new string[]{"A","B","C","P","R","S","T"};
						validVersionCodes[HL7Version.v231] = new string[]{"S","A","R","P","T","C","B"};
						validVersionCodes[HL7Version.v24] = new string[]{"S","A","R","P","T","C","B"};
						validVersionCodes[HL7Version.v25] = new string[]{"S","A","R","P","T","C","B"};
						validVersionCodes[HL7Version.v251] = new string[]{"S","A","R","P","T","C","B"};
						validVersionCodes[HL7Version.v26] = new string[]{"S","A","R","P","T","C","B"};
						validVersionCodes[HL7Version.v27] = new string[]{"S","A","R","P","T","C","B"};
			
			// init the values for version descriptions
						validVersionDescriptions[HL7Version.v23] = new string[]{"As soon as possible (a priority lower than stat)","Do at bedside or portable (may be used with other codes)","Measure continuously (e.g., arterial line blood pressure)","Preoperative (to be done prior to surgery)","Routine","Stat (do immediately)","Timing critical (do as near as possible to requested time)"};
						validVersionDescriptions[HL7Version.v231] = new string[]{"Stat (do immediately)","As soon as possible (a priority lower than stat)","Routine","Preoperative (to be done prior to surgery)","Timing critical (do as near as possible to requested time)","Measure continuously (e.g., arterial line blood pressure)","Do at bedside or portable (may be used with other codes)"};
						validVersionDescriptions[HL7Version.v24] = new string[]{"Stat (do immediately)","As soon as possible (a priority lower than stat)","Routine","Preoperative (to be done prior to surgery)","Timing critical (do as near as possible to requested time)","Measure continuously (e.g., arterial line blood pressure)","Do at bedside or portable (may be used with other codes)"};
						validVersionDescriptions[HL7Version.v25] = new string[]{"Stat (do immediately)","As soon as possible (a priority lower than stat)","Routine","Preoperative (to be done prior to surgery)","Timing critical (do as near as possible to requested time)","Measure continuously (e.g., arterial line blood pressure)","Do at bedside or portable (may be used with other codes)"};
						validVersionDescriptions[HL7Version.v251] = new string[]{"Stat (do immediately)","As soon as possible (a priority lower than stat)","Routine","Preoperative (to be done prior to surgery)","Timing critical (do as near as possible to requested time)","Measure continuously (e.g., arterial line blood pressure)","Do at bedside or portable (may be used with other codes)"};
						validVersionDescriptions[HL7Version.v26] = new string[]{"Stat (do immediately)","As soon as possible (a priority lower than stat)","Routine","Preoperative (to be done prior to surgery)","Timing critical (do as near as possible to requested time)","Measure continuously (e.g., arterial line blood pressure)","Do at bedside or portable (may be used with other codes)"};
						validVersionDescriptions[HL7Version.v27] = new string[]{"Stat (do immediately)","As soon as possible (a priority lower than stat)","Routine","Preoperative (to be done prior to surgery)","Timing critical (do as near as possible to requested time)","Measure continuously (e.g., arterial line blood pressure)","Do at bedside or portable (may be used with other codes)"};
			            

        }

        
        public override ValidationIssue[] RunRule(string name, object owningObject, object value)
        {
            //todo: check if the value is valid in the current version
            //if the value is not valid in the current version, add it as a validation issue


            return new ValidationIssue[0];
        }
    }
}
